/*
    异步请求
    数据处理
*/
function basePromise_json_get(_url, _data) {
  return new Promise((resolve, reject) => {
    $.ajax({
      url: _url,
      method: "get",
      data: _data,
      dataType: "json",
      success: function (result) {
        resolve(result);
      },
    });
  });
}

function basePromise_json_post(_url, _data) {
  return new Promise((resolve, rejected) => {
    $.ajax({
      url: _url,
      method: "post",
      data: _data,
      dataType: "json",
      success: function (result) {
        resolve(result);
      },
    });
  });
}

// 获取数据
function getAllData() {
  return basePromise_json_get("getAllData");
}

// 删除元素
function deleteItem(number) {
  return basePromise_json_post("delete_goods", { ID: number });
}
// 替换元素
function alterItem(data) {
  return basePromise_json_post("alter_goods", data);
}
// 添加元素
function addItem(data) {
  return basePromise_json_post("add_goods", data);
}

/*
    静态文件
    界面设置
*/

// 定义头部声明
var MainHeader = $("<div>")
  .addClass("MainHeader")
  .append(
    $("<div>").append("title").text("基于Django框架开发的商品销售管理系统")
  )
  .append($("<div>").append("information").text("开发者：21033109 - 梁志成"));

// 定义主容器
var MainContainer = $("<div>").addClass("MainContainer");

// 定义主表控件
var MainTableManager = {
  main: $("<table>").addClass("MainTable"),
  thead: $("<thead>").append(
    $("<tr>")
      .append($("<th>").text("ID").hide())
      .append($("<th>").text("商品名称"))
      .append($("<th>").text("计量单位"))
      .append($("<th>").text("单价"))
  ),
  tbody: $("<tbody>"),
};

// 主表控件内部关系
MainContainer.append(
  MainTableManager.main
    .append(MainTableManager.thead)
    .append(MainTableManager.tbody)
);

// 定义右侧功能按钮组
var EditManager = {
  main: $("<div>").addClass("EditDiv"),
  Btn_start: $("<div>").text("开始营业").addClass("Btn Btn_start"),
  Btn_add: $("<div>").text("添加商品").addClass("Btn Btn_add"),
  Btn_buy: $("<div>").text("进入购物").addClass("Btn Btn_buy"),
  Btn_finish: $("<div>").text("完成购物").addClass("Btn Btn_finish").hide(),
  Btn_over: $("<div>").text("营业结束").addClass("Btn Btn_over").hide(),
};

// 按钮组间关系
MainContainer.append(
  EditManager.main
    .append(EditManager.Btn_start)
    .append(EditManager.Btn_add)
    .append(EditManager.Btn_buy)
    .append(EditManager.Btn_finish)
    .append(EditManager.Btn_over)
);

// 定义菜单管理器
var MenuManager = {
  main: $("<div>").addClass("Menu"),
  MenuItem_delete: $("<div>").text("删除").addClass("MenuItem MenuItem_delete"),
  MenuItem_edit: $("<div>").text("修改").addClass("MenuItem MenuItem_edit"),

  goal_good_number: undefined,
};

// 菜单管理器内部关系
MenuManager.main
  .append(MenuManager.MenuItem_delete)
  .append(MenuManager.MenuItem_edit)
  .hide();

// 主表控件内添加数据
MainTableManager.main
  .append(MainTableManager.thead)
  .append(MainTableManager.tbody);

// 声明用于增改商品信息的表单
function getLDivMgr_NamedInput(name) {
  var res = {
    main: $("<div>").addClass("LDiv_NameInput"),
    input: $("<input>").addClass("input").prop("required", true),
    span: $("<span>").addClass("text").text(name),
  };
  res.main.append(res.input).append(res.span);
  return res;
}

const GoodDataFormMode_add = 0;
const GoodDataFormMode_edit = 1;

// 商品数据表单
var GoodDataForm = {
  main: $("<div>").addClass("GoodDataForm"),
  ID: getLDivMgr_NamedInput("ID"),
  name: getLDivMgr_NamedInput("名称"),
  unit: getLDivMgr_NamedInput("单位"),
  price: getLDivMgr_NamedInput("价格"),

  CommittedButton: $("<div>", { class: "CommittedButton", text: "提交" }),
  CancelButton: $("<div>", { class: "CancelButton", text: "取消" }),

  GoodDataFormMode: undefined,
  goal_good_number: undefined,
};

// 上述表单内部关系
GoodDataForm.main
  .append(GoodDataForm.ID.main.addClass("ID"))
  .append(GoodDataForm.name.main.addClass("name"))
  .append(GoodDataForm.unit.main.addClass("unit"))
  .append(GoodDataForm.price.main.addClass("price"))

  .append(GoodDataForm.CommittedButton)
  .append(GoodDataForm.CancelButton)
  .hide()
  .appendTo(MainContainer);

const ColumnIndexMapping = {
  ID: 0,
  名称: 1,
  单位: 2,
  价格: 3,
};

/*
    函数方法
*/
var CurrentData;

// 加载数据
function loadData(data) {
  if (data.length) {
    CurrentData = data;
    $(data).each((i, item) => {
      let _tr = $("<tr>");
      $(item).each((ii, value) => {
        let td = $("<td>").text(value)
        if (ii === 0) {
          td.hide();
        }
        _tr.append(td);
      });
      MainTableManager.tbody.append(_tr);
    });
  } else {
    console.log("数据集为空！");
  }
}


// 清空表体
function clearTBody() {
  MainTableManager.tbody.empty();
}

// 重新加载数据
function reloadData(data) {
  clearTBody();
  loadData(data);
}

// 绑定删、改菜单的右键唤出事件
MainTableManager.tbody.on("contextmenu", "tr", (e) => {
  e.preventDefault();

  if ($(e.target)[0].tagName == "TD") {
    var goal = $(e.target).parent();
  } else {
    var goal = $(e.target);
  }
  MenuManager.goal_good_number = $(goal.find("td")[0]).text();
  MenuManager.main.css({ left: e.pageX, top: e.pageY }).show(100);
});

// 绑定删、改菜单的隐藏事件
$(() => {
  $("body").mousedown((e) => {
    if (!$(e.target).hasClass("MenuItem")) {
      MenuManager.main.hide(100);
    }
  });
});

// 绑定删除菜单项的点击事件
MenuManager.MenuItem_delete.click((e) => {
  deleteItem(MenuManager.goal_good_number).then((val) => {
    MainTableManager.tbody
      .children()
      .filter(function (i, item) {
        return $(this).children().eq(0).text() === MenuManager.goal_good_number;
      })
      .remove();
  });
  MenuManager.main.hide(100);
});

// 绑定修改菜单项的点击事件
MenuManager.MenuItem_edit.click((e) => {
  let OldInputData;
  GoodDataForm.ID.main.hide();
  $(CurrentData).each((i, item) => {
    if (item[0] == MenuManager.goal_good_number) {
      OldInputData = item;
      return;
    }
  });

  GoodDataForm.ID.input.val(MenuManager.goal_good_number);
  GoodDataForm.name.input.val(OldInputData[1]);
  GoodDataForm.unit.input.val(OldInputData[2]);
  GoodDataForm.price.input.val(OldInputData[3]);

  GoodDataForm.goal_good_number = MenuManager.goal_good_number;
  GoodDataForm.GoodDataFormMode = GoodDataFormMode_edit;

  GoodDataForm.main.show(200);
  MenuManager.main.hide(100);
});

// 新增记录
EditManager.Btn_add.click((e) => {
  GoodDataForm.GoodDataFormMode = GoodDataFormMode_add;
  GoodDataForm.ID.main.hide();
  GoodDataForm.main.show(200);
});

// 按键提交数据
GoodDataForm.CommittedButton.click((e) => {
  console.log(e.target);
  // 预处理各个输入框容器
  if (true) {

    var name = GoodDataForm.name.input.val();
    if (name === "") {
      return;
    }

    var unit = GoodDataForm.unit.input.val();
    if (unit === "") {
      return;
    }

    var price = GoodDataForm.price.input.val();
    if (price === "") {
      return;
    }
  }

  GoodDataForm.name.input.val("");
  GoodDataForm.unit.input.val("");
  GoodDataForm.price.input.val("");
  console.log(name);
  console.log(unit);
  console.log(price);
  let data = {
    name: name,
    unit: unit,
    price: price,
  };

  if (GoodDataForm.GoodDataFormMode == GoodDataFormMode_add) {
    addItem(data).then((val) => {
      getAllData().then(reloadData);
    });
  } else if (GoodDataForm.GoodDataFormMode == GoodDataFormMode_edit) {
    data.ID = GoodDataForm.goal_good_number;
    alterItem(data).then((val) => {
      getAllData().then(reloadData);
    });
  }
  GoodDataForm.main.hide(200);
});

// 按键取消
GoodDataForm.CancelButton.click((e) => {
  GoodDataForm.ID.input.val("");
  GoodDataForm.name.input.val("");
  GoodDataForm.unit.input.val("");
  GoodDataForm.price.input.val("");
  GoodDataForm.main.hide(200);
});

// 开始营业
EditManager.Btn_start.click((e) => {
  location.reload(); // 刷新浏览器界面
})

// 确定购物状态，开始还是取消
var flag_buying = 0;

// 购物
EditManager.Btn_buy.click((e) => {
  GoodDataForm.main.hide();
  if (flag_buying == 0) {
    flag_buying = 1;
    // 表头添加一列购物数量
    MainTableManager.thead.children().eq(0).prepend($("<th>").text("购物数量"));
    MainTableManager.tbody.children().each((i, tr) => {
      // 创建输入框
      let input = $("<input>").val(0);
      // 封装到行
      $("<td>").append(input).prependTo($(tr));
    });
    EditManager.Btn_add.hide();
    EditManager.Btn_start.hide();
    EditManager.Btn_finish.show().css({ "background-color": "lightgreen" });
    // 重定义进入购物为取消购物
    EditManager.Btn_buy.text("取消购物").css({ "background-color": "red" });
  } else {
    flag_buying = 0;
    MainTableManager.thead.children().eq(0).children().eq(0).remove();
    MainTableManager.tbody.children().each((i, tr) => {
      $(tr).children().eq(0).remove();
    });

    EditManager.Btn_add.show();
    EditManager.Btn_finish.hide();
    EditManager.Btn_start.show();
    EditManager.Btn_buy.text("进入购物").css({ "background-color": "transparent" });
  }
});

var buy_count = 0;        // 记录购物次数
var TotalPrice = [];      // 统计总销售额
var PriceArrays;          // 记录商品单价

// 完成购物
EditManager.Btn_finish.click((e) => {
  MainTableManager.thead.children().eq(0).children().eq(0).remove();
  // 存储对应商品购物数量
  let CountArray = [];
  MainTableManager.tbody.children().each((i, tr) => {
    let goal_td = $(tr).children().eq(0);
    CountArray.push(parseFloat(goal_td.children().eq(0).val()));
    goal_td.remove();
  });
  // 存储每件商品单价
  let PriceArray = [];
  MainTableManager.tbody.children().each((i, tr) => {
    let goal_td = $(tr).children().eq(3);
    PriceArray.push(parseFloat(goal_td.text()));
  });
  PriceArrays = PriceArray

  buy_count += 1;

  let _total = 0;
  MainTableManager.thead
    .children()
    .eq(0)
    .append($("<th>").text(`第 ${buy_count} 次购物销售金额`));
  MainTableManager.tbody.children().each((i, tr) => {
    let _price = PriceArray[i] * CountArray[i];
    _total += _price;
    $("<td>").text(_price).appendTo($(tr));
  });
  // 记录每次总销售金额
  TotalPrice.push(_total);

  flag_buying = 0;
  EditManager.Btn_add.show();
  EditManager.Btn_over.show();
  EditManager.Btn_finish.hide();
  EditManager.Btn_start.show();
  EditManager.Btn_buy.text("进入购物").css({ "background-color": "white" });

  alert(`第 ${buy_count} 次购物销售总金额：${_total}元; `);
});

// 营业结束
EditManager.Btn_over.click((e) => {
  MainTableManager.thead
    .children()
    .eq(0)
    .children()
    .each((i, th) => {
      if (i > 4) {
        $(th).remove();
      } else if (i == 4) {
        $(th).text("销售金额");
      }
    });
    // 统计单个商品总销售金额
    let goods_total_money = []
      MainTableManager.tbody.children().each((i, tr) => {
        let good_total_money = 0;
        $(tr).children().each((ii, td) => {
          if (ii >= 4) {
            good_total_money += parseFloat($(td).text());
            if (ii != 4) {
              $(td).remove();
            }
          }
        });
        $(tr).children().eq(4).text(good_total_money);
        goods_total_money.push(good_total_money);
      });

  let totalMoney = 0;
  $(TotalPrice).each((i, item) => {
    totalMoney += item;
  });
  // 添加营业结束后各商品总销售量一列
  MainTableManager.thead.children().eq(0).children().eq(-1).before($("<th>").text("销售量"));
  MainTableManager.tbody.children().each((i, tr) => {
    $(tr).children().eq(-1).before($('<td>').text(goods_total_money[i] / PriceArrays[i]));
  })
  alert(`营业结束，总营业额为：${totalMoney}元; `);
  EditManager.Btn_over.hide();
})

// 初始化控件
$(() => {
  MainHeader.appendTo("body");
  MainContainer.appendTo("body");
  MenuManager.main.appendTo("body");

  getAllData().then(loadData);
});
